home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / nasm095s.zip / RDOFF / SYMTAB.C < prev    next >
C/C++ Source or Header  |  1997-07-27  |  2KB  |  81 lines

  1. /* symtab.c    Routines to maintain and manipulate a symbol table
  2.  *
  3.  * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
  4.  * Julian Hall. All rights reserved. The software is
  5.  * redistributable under the licence given in the file "Licence"
  6.  * distributed in the NASM archive.
  7.  */
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10.  
  11. #include "symtab.h"
  12.  
  13. /* TODO: Implement a hash table, not this stupid implementation which
  14.    is too slow to be of practical use */
  15.  
  16. /* Private data types */
  17.  
  18. typedef struct tagSymtab {
  19.   symtabEnt        ent;
  20.   struct tagSymtab    * next;
  21. } symtabList;
  22.  
  23. typedef symtabList *    _symtab;
  24.  
  25. void *symtabNew(void)
  26. {
  27.   void *p = malloc(sizeof(_symtab));
  28.   if (p == NULL) {
  29.     fprintf(stderr,"symtab: out of memory\n");
  30.     exit(3);
  31.   }
  32.   *(_symtab *)p = NULL;
  33.  
  34.   return p;
  35. }
  36.  
  37. void symtabDone(void *symtab)
  38. {
  39.   /* DO SOMETHING HERE! */
  40. }
  41.  
  42. void symtabInsert(void *symtab,symtabEnt *ent)
  43. {
  44.   symtabList    *l = malloc(sizeof(symtabList));
  45.  
  46.   if (l == NULL) {
  47.     fprintf(stderr,"symtab: out of memory\n");
  48.     exit(3);
  49.   }
  50.  
  51.   l->ent = *ent;
  52.   l->next = *(_symtab *)symtab;
  53.   *(_symtab *)symtab = l;
  54. }
  55.  
  56. symtabEnt *symtabFind(void *symtab,char *name)
  57. {
  58.   symtabList    *l = *(_symtab *)symtab;
  59.  
  60.   while (l) {
  61.     if (!strcmp(l->ent.name,name)) {
  62.       return &(l->ent);
  63.     }
  64.     l = l->next;
  65.   }  
  66.   return NULL;
  67. }
  68.  
  69. void symtabDump(void *symtab,FILE *of)
  70. {
  71.   symtabList    *l = *(_symtab *)symtab;
  72.  
  73.   while(l) {
  74.     fprintf(of,"%32s %s:%08lx (%ld)\n",l->ent.name,
  75.         l->ent.segment ? "data" : "code" ,
  76.         l->ent.offset, l->ent.flags);
  77.     l = l->next;
  78.   }
  79. }
  80.  
  81.